#ifndef __LYNX_LISTENER_C_HPP_INCLUDED__
#define __LYNX_LISTENER_C_HPP_INCLUDED__

#include <AL/al.h>
#include "LynxListener.hpp"

namespace Lynx
{
namespace Audio
{

////////////////////////////////////////////////////////////////////////////
ALenum DM_Lynx_to_AL(LYNX_AUDIO_DISTANCE_MODEL model);


////////////////////////////////////////////////////////////////////////////
LYNX_AUDIO_DISTANCE_MODEL DM_AL_to_Lynx(ALenum model);

class Listener_C : public virtual Listener
{
public:

    ////////////////////////////////////////////////////////////////////////////
    virtual void set_position(const Myth::Math::Vector3f &position);


    ////////////////////////////////////////////////////////////////////////////
    virtual Myth::Math::Vector3f get_position(void) const;


    ////////////////////////////////////////////////////////////////////////////
    virtual void set_velocity(const Myth::Math::Vector3f &velocity);


    ////////////////////////////////////////////////////////////////////////////
    virtual Myth::Math::Vector3f get_velocity(void) const;


    ////////////////////////////////////////////////////////////////////////////
    virtual void set_up_vector(const Myth::Math::Vector3f &up);


    ////////////////////////////////////////////////////////////////////////////
    virtual Myth::Math::Vector3f get_up_vector(void) const;


    ////////////////////////////////////////////////////////////////////////////
    virtual void set_target(const Myth::Math::Vector3f &target);


    ////////////////////////////////////////////////////////////////////////////
    virtual Myth::Math::Vector3f get_target(void) const;


    ////////////////////////////////////////////////////////////////////////////
    virtual void set_orientation(const Myth::Math::Vector3f &target,
                                 const Myth::Math::Vector3f &up);


    ////////////////////////////////////////////////////////////////////////////
    virtual void set_volume(float volume = 1.0f);


    ////////////////////////////////////////////////////////////////////////////
    virtual float get_volume(void) const;


    ////////////////////////////////////////////////////////////////////////////
    virtual void set_doppler_factor(float factor = 1.0);


    ////////////////////////////////////////////////////////////////////////////
    virtual float get_doppler_factor(void) const;


    ////////////////////////////////////////////////////////////////////////////
    virtual void set_speed_of_sound(float speed = 343.3f);


    ////////////////////////////////////////////////////////////////////////////
    virtual float get_speed_of_sound(void) const;


    ////////////////////////////////////////////////////////////////////////////
    virtual void set_distance_model(LYNX_AUDIO_DISTANCE_MODEL model);


    ////////////////////////////////////////////////////////////////////////////
    virtual LYNX_AUDIO_DISTANCE_MODEL get_distance_model(void) const;
};

} // namespace Audio
} // namespace Lynx

#endif // __LYNX_LISTENER_C_HPP_INCLUDED__

